透過程式碼來進行檔案讀取的操作,是相當重要的一項技能。在 Python 裡面,可以使用 open()
函式來開啟檔案。在此之前,我們需要先上傳一個範例檔案到 Colab 裡面:
點開之後稍等一下,就會跑出一個檔案總管,在 Colab 裡面已經預先放了一點檔案。各位可以先下載這個檔案,然後將他上傳到 Colab 裡面:
開啟檔案的語法如下:
fp = open("zh-wikipedia-math.txt")
需要注意,在左邊的檔案總管與程式碼裡面的檔案名稱需要一致:
開啟檔案的模式主要分成讀取 (Read) 與寫入 (Write),預設的模式已經是讀取,但如果想要更加強調這點,可以加上第二個參數 "r"
來表示:
fp = open("zh-wikipedia-math.txt", "r")
一般來說,多數的檔案都是使用 UTF-8 編碼,在 Colab 裡面沒有特別指定編碼種類通常不會有問題,但是在 Windows 作業系統裡面就不是這麼一回事了,因此建議再加上一個 encoding
參數:
fp = open("zh-wikipedia-math.txt", "r", encoding="UTF-8")
要將檔案內容讀取進來,可以使用 .read()
方法:
>>> print(fp.read())
數學是研究數量、結構以及空間等概念及其變化的一門學科,屬於形式科學的一種。
數學利用抽象化和邏輯推理,從計數、計算、量度、對物體形狀及運動的觀察發展而成。
... (略)
.read()
會將檔案內容全部讀取進來,以一個字串來呈現。如果將以上程式碼重複執行第二次,會發現輸出不了任何東西!這是因為在檔案讀取的情況下,同樣的內容只會被讀取一次,使用 .read()
會一口氣讀到檔案結尾,因此再執行一次 .read()
就讀取不到任何東西了。如果想要再讀取一次,可以選擇再 open()
一次,也可以選擇對 fp
使用 .seek()
方法:
>>> fp.seek(0)
>>> print(fp.read())
數學是 ... (略)
fp.seek(0)
會將檔案的讀取位置重新放到檔案最開頭的位置,也就是第 0 個字前面,這樣就能再次讀取檔案的內容了。
完成檔案讀取後,需要使用 .close()
方法,關閉這個檔案的讀取:
fp = open("zh-wikipedia-math.txt")
fp.read()
fp.close()
with
語法每次讀取檔案都要呼叫 .close()
可能有點麻煩,這時可以使用 Python 的 with .. as ...
的語法:
with open("zh-wikipedia-math.txt") as fp:
print(fp.read())
使用 with
語法語法,會讓 fp
在脫離程式碼區塊後,自動呼叫 .close()
方法來關閉檔案,這也是 Python 推薦的讀寫檔語法。
如果不想要一次把所有檔案內容讀取進來,可以使用 for
迴圈來逐行讀取:
>>> with open("zh-wikipedia-math.txt") as fp:
>>> for line in fp:
>>> print(repr(line))
'數學是研究數量、結構以及空間等概念及其變化的一門學科,屬於形式科學的一種。\n'
'數學利用抽象化和邏輯推理,從計數、計算、量度、對物體形狀及運動的觀察發展而成。\n'
'數學家們拓展這些概念,以公式化新的猜想,以及從選定的公理及定義出發,嚴謹地推導出一些定理。\n'
'\n'
用 for
迴圈直接對 fp
迭代,就可以逐行讀取檔案的內容。這裡用到 repr()
函式,是用來顯示該變數的原始內容,透過 repr()
可以發現,每行文字的最後面都出現了 \n
的符號,這是什麼呢?反斜線 \
用在字串裡面是跳脫字元的用法,也就是說這個反斜線與他後面的一個字元並不會被顯示出來,而是用作某種特殊用途的,而 \n
是用來表示換行的意思。
如果直接將結尾帶有換行符號的字串放在 print()
裡面,那就會輸出兩個換行符號,因此多數情況下都會希望把這個換行符號消掉,可以使用 .strip()
方法,假設要把每行字串反過來輸出,可以這樣寫:
>>> with open("zh-wikipedia-math.txt") as fp:
>>> for line in fp:
>>> print(line.strip()[::-1])
。種一的學科式形於屬,科學門一的化變其及念概等間空及以構結、量數究研是學數
。成而展發察觀的動運及狀形體物對、度量、算計、數計從,理推輯邏和化象抽用利學數
。理定些一出導推地謹嚴,發出義定及理公的定選從及以,想猜的新化式公以,念概些這展拓們家學數
... (略)
以上就是基本的檔案讀取方法!